<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>1_类的基本知识</title>
</head>
<body>
  <script type="text/javascript">
    /**
     * 总结：
        1.类中的构造器不是必须要写的，要对实例进行一些初始化的操作，如添加指定属性时才写。
        2.如果A类继承了B类，且A类中写了构造器，那么A类构造器中的super是必须要调用的。
        3.类中所定义的方法，都放在了类的原型对象上，供实例去使用。
     */
    // 创建一个Person类
    class Person {
      // 构造方法
      constructor(name,age) {
        // 构造器方法中this 类的实例对象
        this.name = name
        this.age = age;
      }
      // 一般方法
      speak(){
        // 放在类的原型对象 供实例使用
        // 通过Person实例调用speak时 speak中的this就是Person实例
        console.log(`我叫${this.name},我年龄是${this.age}`)
      }
    }

    // 创建一个Student类 继承Person
    class Student extends Person{
      constructor(name,age,grade) {
        super(name,age);
        this.grade = grade
        this.school = 'zmq'
      }
      speak() {
        // 通过Student实例调用speak时 speak中的this就是Student实例
        console.log(`我叫${this.name},我年龄是${this.age},我的年级是${this.grade}`)
      }
      study(){
        console.log('我很努力的学习')
      }
    }
    // 创建一个Person的实例对象
    const p1 = new Person('tom',18)
    const p2 = new Person('jack',18)
    console.log(p1)
    console.log(p2)
    p1.speak()
    p2.speak()

    // 创建一个Student的实例对象
    const s1 = new Student('小张',18,'大一')
    console.log(s1)
    s1.speak()
    s1.study()

    class  Car {
      constructor(name,price) {
        this.name = name
        this.price = price
        // this.wheel = 4
      }
      // 类中可以直接写赋值语句
      // 给Car实例对象条件名为a值为1的属性
      a = 1
      wheel = 4
      static demo = 100
    }
    const c1 = new Car('奥迪Q5',35)
    console.log(c1)
    console.log(Car.demo)
  </script>
</body>
</html>
